﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using MemoryDuosControl;
using MemoryDuosRankings;

namespace MemoryDuosInterfaz
{
    public partial class Main : Form
    {
        private Publicidad Publi { get; set; }

        private DAL dal { get; set; }

        private List<Partida> listaEmpezar { get; set; }

        private List<Partida> _listaEnJuego { get; set; }

        private BindingList<Partida> listaEnJuego { get; set; }

        private List<Partida> listaFinalizadas, listaRechazadas;
        private TimeSpan timeoutUpdate = new TimeSpan(0, 1, 0);
        private DateTime ultimoUpdate;

        public Main()
        {
            InitializeComponent();
            Publi = new Publicidad(pictureBox1);
            dal = DAL.Instance;
            ultimoUpdate = DateTime.MinValue;
        }

        private void bjugar_MouseHover(object sender, EventArgs e)
        {
            // var button = sender as Button; var bname = button.name; ToolTip t1 = new ToolTip();
            // t1.Show(button.Name, bjugar);

            //this.bjugar.Size = new System.Drawing.Size(285, 50);
            //System.Windows.Forms.Button bselect=new ;
            // this.bname.Size = new System.Drawing.Size(285, 150);
        }

        private void jugar_Click(object sender, EventArgs e)
        {
            SeleccionNivel selNivel = new SeleccionNivel();
            if (dal.HayPartidaSinFinalizar())
            {
                // selNivel.ShowDialog(this);
                selNivel.Owner = this;// selNivel.Show(this);
                var rnk = dal.ObtenerPartidaSinFinalizar();
                selNivel.ContinuarPartida(rnk);
            }
            else
            {
                selNivel.ShowDialog(this);
            }
        }

        private void ranking_Click(object sender, EventArgs e)
        {
            RankingIndividual rank = new RankingIndividual();

            rank.ShowDialog();
        }

        private void salir_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }

        private void Main_Load(object sender, EventArgs e)
        {
#if DEBUG

            Usuario actual = new Usuario("alex@alex", "", "a");
            if (actual.Login())
            {
                actual = actual.ActualizarDatosUsuario();
                Controlador.Instance.UsuarioActual = actual;
                this.Activate();
            }
#endif
        }

        private void Main_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void breglas_Click(object sender, EventArgs e)
        {
            Reglas reg = new Reglas();
            reg.ShowDialog();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            Publi.cargarEnlaces();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Login login = new Login();
            login.ShowDialog(this);
            ActualizarInterfaz();
        }

        private void buttonRegistro_Click(object sender, EventArgs e)
        {
            Registro reg = new Registro();
            reg.ShowDialog();
        }

        /*  private void listaPArtidasPorEmpezar_SelectedIndexChanged(object sender, EventArgs e)
          {
              buttonAceptarPartida.Enabled = true;
          }*/

        private void listaPartidasEnJuego_SelectedIndexChanged(object sender, EventArgs e)
        {
            buttonContinuarPartida.Enabled = true;
            buttonAbandonarPartida.Enabled = true;
        }

        private void Main_Activated(object sender, EventArgs e)
        {
            if (DateTime.Now - ultimoUpdate > timeoutUpdate)
            {
                ActualizarInterfaz();
            }
        }

        private void ActualizarInterfaz()
        {
            ultimoUpdate = DateTime.Now;
            if (HayUsuarioLogueado())
            {
                ActualizarControlesConUsuario();
                ActualizarPartidasPorJugar();
                ActualizarPartidasTerminadas();
            }
            else
            {
                ActualizarControlesSinUsuario();
            }
        }

        private bool MiTurno(Partida part)
        {
            return part.Turno.Equals(Controlador.Instance.UsuarioActual.ID);
        }

        private bool Esperando(Partida part)
        {
            return Controlador.Instance.UsuarioActual.ID.Equals(part.Usuario_2);
        }

        private void ActualizarPartidasPorJugar()
        {
            _listaEnJuego = Controlador.Instance.UsuarioActual.ObtenerPartidasEnJuego();
            if (_listaEnJuego != null)
            {
                listaEnJuego = new BindingList<Partida>(_listaEnJuego);
                DataGridEnJuego.DataSource = listaEnJuego;
                //var ListaPendientes = Controlador.Instance.UsuarioActual.ObtenerPartidasPendientes();
                int i = 0;
                if (_listaEnJuego != null)
                    foreach (var partida in _listaEnJuego)
                    {
                        var Turno = partida.Turno.Equals(Controlador.Instance.UsuarioActual.ID);
                        if (Turno)
                        {
                            if (partida.NMovimiento == 1)
                                DataGridEnJuego[0, i].Value = "Te han retado ";
                            else DataGridEnJuego[0, i].Value = "Tu turno ";
                            //DataGridEnJuego.Rows[i].DefaultCellStyle.BackColor = Color.LightGreen;
                            DataGridEnJuego[0, i].Style.BackColor = Color.LightGreen;
                        }
                        else
                        {
                            if (partida.NMovimiento == 1)
                                DataGridEnJuego[0, i].Value = "Has retado ";
                            else DataGridEnJuego[0, i].Value = "En espera";
                            DataGridEnJuego[0, i].Style.BackColor = Color.LightGray;
                        }
                        i++;
                    }
            }
        }

        ///<summary>
        ///metodo que añade partidas terminadas
        ///</summary>
        private void ActualizarPartidasTerminadas()
        {
            listaFinalizadas = Controlador.Instance.UsuarioActual.ObtenerPartidasFinalizadas();
            //listaRechazadas = Controlador.Instance.UsuarioActual.ObtenerPartidasRechazadas();
            // var lista = listaFinalizadas.Concat(listaRechazadas);
            DataGridFinalizada.DataSource = listaFinalizadas;
        }

        private void ActualizarControlesConUsuario()
        {
            labelNombre.Text = "Usuario:" + Controlador.Instance.UsuarioActual.Nick;
            buttonLogin.Hide();
            buttonRegistro.Hide();
            buttonLogout.Show();
            buttonMultijugador.Show();
            buttonResfrescar.Show();
            /**/
            DataGridEnJuego.Show();
            DataGridFinalizada.Show();
            /**/

            tabControlPartidas.Show();
            buttonContinuarPartida.Show();
            buttonAbandonarPartida.Show();
            buttonAdministrar.Show();
            if (Controlador.Instance.UsuarioActual.ImagenPerfil != null)
            {
                pFoto.Image = Controlador.Instance.UsuarioActual.ImagenPerfil;
            }
        }

        private void ActualizarControlesSinUsuario()
        {
            labelNombre.Text = "MemoryDuos";
            pFoto.Image = Properties.Resources.MEMORYDUOS;

            buttonLogin.Show();
            buttonRegistro.Show();
            buttonLogout.Hide();
            buttonAdministrar.Hide();
            buttonMultijugador.Hide();
            tabControlPartidas.Hide();
            buttonContinuarPartida.Hide();
            buttonAbandonarPartida.Hide();
            buttonResfrescar.Hide();
            /**/
            DataGridEnJuego.Hide();
            DataGridFinalizada.Hide();
            DataGridFinalizada.Hide();
            /**/
        }

        private bool HayUsuarioLogueado()
        {
            if (Controlador.Instance.UsuarioActual != null)
            {
                return true;
            }
            return false;
        }

        private void buttonMultijugador_Click(object sender, EventArgs e)
        {
            if (!HayUsuarioLogueado())
            {
                button1_Click(sender, e);
            }
            NuevaMultijugador nueva = new NuevaMultijugador();
            nueva.ShowDialog(this);
        }

        private void buttonLogout_Click(object sender, EventArgs e)
        {
            Controlador.Instance.UsuarioActual = null;
            ActualizarInterfaz();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            RankingGlobal rankingGlobal = new RankingGlobal();
            rankingGlobal.Show();
        }

        private void buttonAbandonarPartida_Click(object sender, EventArgs e)
        {
            buttonAbandonarPartida.Enabled = false;

            var lista = DataGridEnJuego.CurrentRow;
            var indice = -1;
            if (lista != null)
                indice = lista.Index;

            if (indice > -1)
            {
                var id = _listaEnJuego.ElementAt(indice).Codigo;
                EstadoPeticion estado = Controlador.Instance.UsuarioActual.RechazarPartida(id);
                if (estado.Estado) listaEnJuego.RemoveAt(indice);
            }
            DataGridEnJuego.Refresh();
        }

        private void buttonContinuarPartida_Click(object sender, EventArgs e)
        {
            var lista = DataGridEnJuego.CurrentRow;
            var indice = -1;
            if (lista != null)
                indice = lista.Index;
            if (indice > -1)
            {
                Cursor.Current = Cursors.WaitCursor;
                var id = _listaEnJuego.ElementAt((indice)).Codigo;
                Controlador.Instance.PartidaActual = _listaEnJuego.ElementAt((indice));
                EstadoTablero estado = Controlador.Instance.UsuarioActual.ObtenerTablero(id);
                //Controlador.Instance.UsuarioActual.Aceptar(id);
                TableroMultijugador tab = new TableroMultijugador(estado);
                PartidaMultijugador part = new PartidaMultijugador(tab);
                Cursor.Current = Cursors.Arrow;
                part.ShowDialog();
                // if (estado.Estado) listboxPartidasEnJuego.Items.RemoveAt((indice));
            }
        }

        private void listboxPartidasEnJuego_SelectedIndexChanged(object sender, EventArgs e)
        {
            buttonContinuarPartida.Enabled = true;
            buttonAbandonarPartida.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Usuario usuarioActual = Controlador.Instance.UsuarioActual;
            String email = usuarioActual.Email;
            String nick = usuarioActual.Nick;
            String nombre = usuarioActual.Nombre;
            String apellidos = usuarioActual.Apellidos;
            String fechaNacimiento = usuarioActual.FechaNacimiento;
            String nacionalidad = usuarioActual.Nacionalidad;
            //String nacionalidad = "España";
            String sexo = usuarioActual.Sexo;
            Registro registro = new Registro(email, nick, nombre, apellidos, fechaNacimiento, nacionalidad, sexo);
            registro.ShowDialog();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            PanelAdministracion panelAdmin = new PanelAdministracion();
            panelAdmin.ShowDialog();
        }

        private void buttonResfrescar_Click(object sender, EventArgs e)
        {
            ActualizarInterfaz();
        }
    }
}
